"""
@name : 10-协程
@author : wenyao
@projectname: sanchuanglianxi
"""
#yield实现
# def jumping_range(n):
#     index = 0
#     while index <n:
#         jump = yield index
#         print("begin.....")
#         #print(jump)
#         if jump is None:
#             jump = 1
#         print("jump:",jump)
#         index += jump
#         print("index:",index)
#         yield jump
#         print("end..")
#
# if __name__ == "__main__":
#     itr = jumping_range(5)
#     print(next(itr))
#     print(itr.send(2))
#     print(next(itr))

#####################################
#greenlet模块实现协程
# from greenlet import greenlet
#
# def func1():
#      print(1)
#      gr2.switch()
#      print(2)
#      gr2.switch()
# def func2():
#     print(3)
#     gr1.switch()
#     print(4)
# gr1 = greenlet(func1)
# gr2 = greenlet(func2)
# gr1.switch()

#############################################
#asyncio 实现协程
import asyncio
import time
async def func1():
    print(1)
    #下载图片a
    await asyncio.sleep(2)
    print(2)

async def func2():
    print(3)
    #下载图片b
    await asyncio.sleep(2)
    print(4)

tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

#去生成一个事件循环
loop = asyncio.get_event_loop()
# #将任务放到任务列表
#asyncio.wait只是等待。它不是直接给出结果，而是给出已完成和挂起的任务
loop.run_until_complete(asyncio.wait(tasks))

###########
#事件循环
# 任务列表 = [任务一，任务二，任务三....]
# while True:
#     #有一个可执行的任务列表
#     #可执行状态   已完成状态
#     #可执行列表    已完成任务列表
#     for  就绪任务 in 可执行任务列表:
#         执行 就绪任务
#
#     for  已完成任务  in   已完成任务列表:
#         在任务列表中移除 已完成任务


